50. 数据框检索

数据检索:数据分析的核心操作

数据检索(Data Retrieval)是数据分析中最基础也最关键的操作之一。

在金融领域,典型应用场景包括:

  • 时间序列分析:从日度股价数据中提取特定年份的子样本
  • 截面研究:筛选符合特定财务指标的上市公司
  • 事件研究:定位公告日前后特定窗口期内的数据
  • 组合构建:根据多因子筛选标准选出目标股票

本章学习目标

通过本章学习,你将掌握以下核心技能:

  1. Pandas的索引系统及其设计哲学
  2. 基于标签(loc)和基于位置(iloc)的两套索引体系
  3. 布尔索引的高级应用技巧
  4. 复杂数据筛选问题的解决思路
  5. 数据检索的性能优化策略

数据检索的数学基础

一个二维数据框可以表示为矩阵 \(D \in \mathbb{R}^{n \times m}\)

  • 行选择:给定行索引集合 \(I\),提取子矩阵 \(D_{I,:}\)
  • 列选择:给定列索引集合 \(J\),提取子矩阵 \(D_{:,J}\)
  • 条件筛选:给定谓词函数 \(P\),提取满足条件的行

\[ D_{\text{filtered}} = \{d_{ij} \mid P(d_{ij}) = \text{True}\} \]

Pandas的两套索引系统

Pandas提供了两套并行的索引系统:

特性 loc(标签索引) iloc(位置索引)
索引类型 数据标签(代码、日期等) 整数位置(从0开始)
切片行为 闭区间 [start, end] 半开区间 [start, end)
适用场景 语义查询(找特定股票) 算法实现(取前N行)
  • 遵循了 Python 哲学:显式优于隐性

列数据的三种访问方式

Listing 1
import pandas as pd
import numpy as np

# 创建示例数据:4只A股的交易日数据
data = {
    '股票代码': ['600519.SH', '000858.SZ', '600036.SH', '601318.SH'],
    '股票名称': ['贵州茅台', '五粮液', '招商银行', '中国平安'],
    '收盘价': [1850.0, 220.5, 45.2, 52.8],
    '涨跌幅': [0.05, -0.02, 0.03, -0.01],
    '成交量': [1200, 3500, 8900, 5600]
}
df = pd.DataFrame(data)

# 方法1:点号访问(列名必须是合法Python标识符)
names = df.股票名称
print('方法1 - 点号选择:')
print(f'类型: {type(names)}')
print(names)
方法1 - 点号选择:
类型: <class 'pandas.core.series.Series'>
0    贵州茅台
1     五粮液
2    招商银行
3    中国平安
Name: 股票名称, dtype: object

方括号访问与链式操作

Listing 2
# 方法2:方括号访问(最通用,推荐)
prices = df['收盘价']
print('方法2 - 方括号选择:')
print(prices)
方法2 - 方括号选择:
0    1850.0
1     220.5
2      45.2
3      52.8
Name: 收盘价, dtype: float64
Listing 3
# 方法3:链式操作
mean_price = df.收盘价.mean()
print(f'\n平均价格: {mean_price:.2f}元')

# 验证:方括号方式结果相同
mean_price_alt = df['收盘价'].mean()
print(f'验证(应相同): {mean_price_alt:.2f}元')

平均价格: 542.12元
验证(应相同): 542.12元

多列选择

Listing 4
# 使用列表选择多列(注意双重方括号)
subset = df[['股票代码', '股票名称', '收盘价']]
print('多列选择结果:')
print(subset)
print(f'\n数据类型: {type(subset)}')
多列选择结果:
        股票代码  股票名称     收盘价
0  600519.SH  贵州茅台  1850.0
1  000858.SZ   五粮液   220.5
2  600036.SH  招商银行    45.2
3  601318.SH  中国平安    52.8

数据类型: <class 'pandas.core.frame.DataFrame'>
  • 单列选择返回 Series(一维数据)
  • 多列选择返回 DataFrame(二维表格)
  • 适用于从宽表中提取关键指标

使用loc进行标签索引

Listing 5
# 设置股票代码为索引
df_indexed = df.set_index('股票代码')
print('索引后的DataFrame:')
print(df_indexed)
print('\n行索引:', df_indexed.index.tolist())
索引后的DataFrame:
           股票名称     收盘价   涨跌幅   成交量
股票代码                               
600519.SH  贵州茅台  1850.0  0.05  1200
000858.SZ   五粮液   220.5 -0.02  3500
600036.SH  招商银行    45.2  0.03  8900
601318.SH  中国平安    52.8 -0.01  5600

行索引: ['600519.SH', '000858.SZ', '600036.SH', '601318.SH']

loc选择单行与多行

# 选择单行:返回Series
stock1 = df_indexed.loc['600519.SH']
print('选择单行 - 贵州茅台:')
print(stock1)
print(f'返回类型: {type(stock1)}')
选择单行 - 贵州茅台:
股票名称      贵州茅台
收盘价     1850.0
涨跌幅       0.05
成交量       1200
Name: 600519.SH, dtype: object
返回类型: <class 'pandas.core.series.Series'>
# 选择多行:返回DataFrame
stocks_subset = df_indexed.loc[['600519.SH', '000858.SZ']]
print('\n选择多行:')
print(stocks_subset)
print(f'返回类型: {type(stocks_subset)}')

选择多行:
           股票名称     收盘价   涨跌幅   成交量
股票代码                               
600519.SH  贵州茅台  1850.0  0.05  1200
000858.SZ   五粮液   220.5 -0.02  3500
返回类型: <class 'pandas.core.frame.DataFrame'>

loc切片:闭区间特性

Listing 6
# loc切片包含结束位置(闭区间 [start, end])
stocks_slice = df_indexed.loc['600519.SH':'600036.SH']
print('loc切片操作(包含边界):')
print(stocks_slice)
loc切片操作(包含边界):
           股票名称     收盘价   涨跌幅   成交量
股票代码                               
600519.SH  贵州茅台  1850.0  0.05  1200
000858.SZ   五粮液   220.5 -0.02  3500
600036.SH  招商银行    45.2  0.03  8900
  • loc切片包含结束位置(闭区间)
  • 符合直觉:说”从A到B”通常包含A和B
  • 与Python传统切片(半开区间)不同

同时选择行和列

Listing 7
# 行标签列表 + 列名列表
df_subset = df_indexed.loc[['600519.SH', '000858.SZ'], ['股票名称', '收盘价']]
print('行和列的组合选择:')
print(df_subset)

# 选择单个标量值
specific_value = df_indexed.loc['600519.SH', '收盘价']
print(f'\n单个标量值: {specific_value}')
print(f'类型: {type(specific_value)}')
行和列的组合选择:
           股票名称     收盘价
股票代码                   
600519.SH  贵州茅台  1850.0
000858.SZ   五粮液   220.5

单个标量值: 1850.0
类型: <class 'numpy.float64'>
  • df.at[row_label, col_label] 是专门为标量访问优化的方法,比loc更快

使用iloc进行位置索引

Listing 8
df_reset = df.reset_index(drop=True)

# 选择第0行(第一行)
row_0 = df_reset.iloc[0]
print('iloc选择第0行:')
print(row_0)
iloc选择第0行:
股票代码    600519.SH
股票名称         贵州茅台
收盘价        1850.0
涨跌幅          0.05
成交量          1200
Name: 0, dtype: object

iloc切片与负索引

# iloc切片:半开区间 [start, end)
rows_1_2 = df_reset.iloc[1:3]
print('iloc切片1:3(不包含索引3):')
print(rows_1_2)

# 选择特定行和列的位置
cell = df_reset.iloc[0, 2]
print(f'\n第0行第2列的值: {cell}')

# 负索引:从末尾计数
last_row = df_reset.iloc[-1]
print(f'\n最后一行:\n{last_row}')
iloc切片1:3(不包含索引3):
        股票代码  股票名称    收盘价   涨跌幅   成交量
1  000858.SZ   五粮液  220.5 -0.02  3500
2  600036.SH  招商银行   45.2  0.03  8900

第0行第2列的值: 1850.0

最后一行:
股票代码    601318.SH
股票名称         中国平安
收盘价          52.8
涨跌幅         -0.01
成交量          5600
Name: 3, dtype: object
  • iloc的切片不包含结束位置(半开区间),与Python列表一致

使用iloc遍历行

Listing 9
print('使用iloc遍历每一行:')
for i in range(len(df_reset)):
    row = df_reset.iloc[i]
    if i < 3:
        print(f'第{i}行: {row["股票名称"]} 收盘价={row["收盘价"]}')
使用iloc遍历每一行:
第0行: 贵州茅台 收盘价=1850.0
第1行: 五粮液 收盘价=220.5
第2行: 招商银行 收盘价=45.2
  • 大规模数据处理时,尽量避免循环
  • 优先使用向量化操作(性能差距可达百倍)

布尔索引:单条件筛选

Listing 10
# 构建布尔条件:返回True/False的Series
condition = df['收盘价'] > 100
print('布尔条件(收盘价>100):')
print(condition)

# 应用布尔条件筛选
high_price = df[condition]
print('\n筛选结果(收盘价>100的股票):')
print(high_price)
布尔条件(收盘价>100):
0     True
1     True
2    False
3    False
Name: 收盘价, dtype: bool

筛选结果(收盘价>100的股票):
        股票代码  股票名称     收盘价   涨跌幅   成交量
0  600519.SH  贵州茅台  1850.0  0.05  1200
1  000858.SZ   五粮液   220.5 -0.02  3500

多条件筛选:AND 与 OR

Listing 11
# AND条件:价格>50 且 涨幅>0(必须用括号!)
condition_and = (df['收盘价'] > 50) & (df['涨跌幅'] > 0)
print('AND条件筛选(价格>50 且 涨幅>0):')
result_and = df[condition_and]
print(result_and[['股票名称', '收盘价', '涨跌幅']])

# OR条件:名称含"银行"或"保险"
condition_or = (df['股票名称'].str.contains('银行')) | (df['股票名称'].str.contains('保险'))
print('\n\nOR条件筛选(银行或保险):')
result_or = df[condition_or]
print(result_or[['股票名称', '收盘价']])
AND条件筛选(价格>50 且 涨幅>0):
   股票名称     收盘价   涨跌幅
0  贵州茅台  1850.0  0.05


OR条件筛选(银行或保险):
   股票名称   收盘价
2  招商银行  45.2

多条件筛选的运算符

运算符 含义 示例
& AND(同时满足) (df['PE'] < 20) & (df['ROE'] > 0.15)
\| OR(满足其一) (df['行业'] == '银行') \| (df['行业'] == '保险')
~ NOT(条件取反) ~df['代码'].isin(blacklist)
  • 重要:每个条件必须用括号包围
  • 位运算符优先级高于比较运算符

query方法:简化复杂条件

Listing 12
# 传统布尔索引方法
complex_condition = (
    (df['收盘价'] > 40) &
    (df['收盘价'] < 2000) &
    (df['涨跌幅'] > 0) &
    (df['成交量'] > 2000)
)
result_complex = df[complex_condition]
print('复杂条件筛选结果:')
print(result_complex[['股票名称', '收盘价', '涨跌幅', '成交量']])

# query方法:语法更简洁
result_query = df.query('收盘价 > 40 and 收盘价 < 2000 and 涨跌幅 > 0 and 成交量 > 2000')
print('\n使用query方法的等价结果:')
print(result_query[['股票名称', '收盘价', '涨跌幅', '成交量']])
复杂条件筛选结果:
   股票名称   收盘价   涨跌幅   成交量
2  招商银行  45.2  0.03  8900

使用query方法的等价结果:
   股票名称   收盘价   涨跌幅   成交量
2  招商银行  45.2  0.03  8900

isin方法:成员资格检查

Listing 13
# 从股票池中筛选关注列表中的股票
watchlist = ['600519.SH', '600036.SH']
selected = df[df['股票代码'].isin(watchlist)]
print('筛选关注列表中的股票:')
print(selected[['股票代码', '股票名称', '收盘价']])

# 组合使用:关注列表中且上涨的股票
selected_and_rising = df[
    df['股票代码'].isin(watchlist) &
    (df['涨跌幅'] > 0)
]
print('\n关注列表中上涨的股票:')
print(selected_and_rising[['股票名称', '涨跌幅']])
筛选关注列表中的股票:
        股票代码  股票名称     收盘价
0  600519.SH  贵州茅台  1850.0
2  600036.SH  招商银行    45.2

关注列表中上涨的股票:
   股票名称   涨跌幅
0  贵州茅台  0.05
2  招商银行  0.03
  • isin()使用哈希表算法,时间复杂度O(1),比链式|高效

反向选择:~ 运算符

Listing 14
# 排除特定股票(黑名单筛选)
excluded = df[~df['股票代码'].isin(['601318.SH', '000001.SZ'])]
print('排除特定股票后的结果:')
print(excluded[['股票代码', '股票名称']])
排除特定股票后的结果:
        股票代码  股票名称
0  600519.SH  贵州茅台
1  000858.SZ   五粮液
2  600036.SH  招商银行
  • 常用于剔除ST股票、风险股票
  • ~ 可与其他条件自由组合

索引的设置与重置

Listing 15
# 设置索引
df_with_index = df.set_index('股票代码')
print('设置股票代码为索引:')
print(df_with_index.head())

# 重置索引(索引变回普通列)
df_reset = df_with_index.reset_index()
print('\n重置索引后:')
print(df_reset.head())

# 丢弃原索引的重置
df_reset_drop = df_with_index.reset_index(drop=True)
print('\n丢弃原索引的重置(股票代码列被删除):')
print(df_reset_drop.head())
设置股票代码为索引:
           股票名称     收盘价   涨跌幅   成交量
股票代码                               
600519.SH  贵州茅台  1850.0  0.05  1200
000858.SZ   五粮液   220.5 -0.02  3500
600036.SH  招商银行    45.2  0.03  8900
601318.SH  中国平安    52.8 -0.01  5600

重置索引后:
        股票代码  股票名称     收盘价   涨跌幅   成交量
0  600519.SH  贵州茅台  1850.0  0.05  1200
1  000858.SZ   五粮液   220.5 -0.02  3500
2  600036.SH  招商银行    45.2  0.03  8900
3  601318.SH  中国平安    52.8 -0.01  5600

丢弃原索引的重置(股票代码列被删除):
   股票名称     收盘价   涨跌幅   成交量
0  贵州茅台  1850.0  0.05  1200
1   五粮液   220.5 -0.02  3500
2  招商银行    45.2  0.03  8900
3  中国平安    52.8 -0.01  5600

性能优化策略一:使用索引加速查找

Listing 16
import time

# 创建10万行的数据
n_rows = 100000
large_df = pd.DataFrame({
    'code': np.random.choice([f'{i:06d}.SH' for i in range(1, 1001)], n_rows),
    'price': np.random.uniform(10, 100, n_rows),
    'volume': np.random.randint(1000, 10000, n_rows)
})

# 方法1:布尔索引(扫描全表,O(n))
start = time.time()
result1 = large_df[large_df['code'] == '000500.SH']
time1 = time.time() - start

# 方法2:设置索引后查找(哈希表,O(1))
indexed_df = large_df.set_index('code')
start = time.time()
result2 = indexed_df.loc['000500.SH']
time2 = time.time() - start

print(f'布尔索引耗时: {time1*1000:.2f}毫秒')
print(f'索引查找耗时: {time2*1000:.2f}毫秒')
print(f'性能提升: {time1/time2:.1f}倍')
布尔索引耗时: 8.49毫秒
索引查找耗时: 6.28毫秒
性能提升: 1.4倍

性能优化策略二:向量化替代循环

Listing 17
# 不推荐:使用循环
start = time.time()
prices_loop = []
for i in range(len(df)):
    if df.iloc[i]['收盘价'] > 100:
        prices_loop.append(df.iloc[i]['收盘价'])
time_loop = time.time() - start

# 推荐:向量化操作
start = time.time()
prices_vectorized = df.loc[df['收盘价'] > 100, '收盘价']
time_vectorized = time.time() - start

print(f'循环方法耗时: {time_loop*1000:.2f}毫秒')
print(f'向量化方法耗时: {time_vectorized*1000:.2f}毫秒')
循环方法耗时: 0.00毫秒
向量化方法耗时: 1.17毫秒
  • 向量化操作底层用C/Fortran实现,避免Python解释器开销
  • 利用CPU的SIMD并行计算和内存局部性

性能优化小结

优化策略 原理 适用场景
使用.loc而非链式索引 避免不必要的内存复制 所有筛选+取列操作
设置索引加速查找 哈希表O(1)查找 频繁按某列查找
向量化替代循环 C/Fortran底层优化 所有批量数据操作
使用.at标量访问 专为单值优化 只需取一个值

综合案例:价值投资策略筛选

Listing 18
import pandas as pd
import numpy as np

# 模拟1000只A股的财务数据
np.random.seed(42)
n_stocks = 1000
stocks_data = pd.DataFrame({
    '股票代码': [f'{i:06d}.{"SH" if i%2==0 else "SZ"}' for i in range(1, n_stocks+1)],
    '股票名称': [f'股票{i}' for i in range(1, n_stocks+1)],
    '市盈率': np.random.uniform(5, 80, n_stocks),
    '市净率': np.random.uniform(0.5, 10, n_stocks),
    'ROE': np.random.uniform(0.05, 0.35, n_stocks),
    '负债率': np.random.uniform(0.2, 0.9, n_stocks),
    '股息率': np.random.uniform(0.005, 0.08, n_stocks)
})

print(f'原始股票池: {len(stocks_data)}只股票')
print(f'\n原始数据概况:')
print(stocks_data[['市盈率', '市净率', 'ROE', '负债率', '股息率']].describe())
原始股票池: 1000只股票

原始数据概况:
               市盈率          市净率          ROE          负债率          股息率
count  1000.000000  1000.000000  1000.000000  1000.000000  1000.000000
mean     41.769241     5.316664     0.200722     0.543263     0.042058
std      21.910302     2.775804     0.087202     0.200543     0.021511
min       5.347402     0.530574     0.050003     0.200457     0.005002
25%      22.697995     2.790206     0.128405     0.369331     0.023373
50%      42.260553     5.427972     0.200184     0.538995     0.042095
75%      60.823969     7.724418     0.277731     0.716279     0.060500
max      79.978825     9.994430     0.349346     0.899690     0.079831

应用价值投资筛选条件

# 筛选条件:PE<20, PB<3, ROE>15%, 负债率<60%, 股息率>2%
value_criteria = (
    (stocks_data['市盈率'] < 20) &
    (stocks_data['市净率'] < 3) &
    (stocks_data['ROE'] > 0.15) &
    (stocks_data['负债率'] < 0.6) &
    (stocks_data['股息率'] > 0.02)
)
value_stocks = stocks_data[value_criteria].copy()

print(f'筛选后符合价值投资标准的股票: {len(value_stocks)}只')
print(f'通过率: {len(value_stocks)/len(stocks_data)*100:.1f}%')

# 按ROE降序排序展示前10只
value_stocks_sorted = value_stocks.sort_values('ROE', ascending=False)
print(f'\n价值投资组合(前10只,按ROE排序):')
print(value_stocks_sorted[['股票代码', '市盈率', '市净率', 'ROE', '负债率', '股息率']].head(10).round(2))
筛选后符合价值投资标准的股票: 13只
通过率: 1.3%

价值投资组合(前10只,按ROE排序):
          股票代码    市盈率   市净率   ROE   负债率   股息率
576  000577.SZ  16.03  0.72  0.34  0.34  0.04
100  000101.SZ   7.36  1.05  0.32  0.26  0.05
925  000926.SH   6.69  1.38  0.32  0.22  0.02
901  000902.SH   6.99  0.55  0.28  0.47  0.04
602  000603.SZ  18.28  2.65  0.27  0.33  0.07
668  000669.SZ  18.99  1.61  0.27  0.22  0.06
809  000810.SH  13.49  1.43  0.27  0.24  0.07
332  000333.SZ   6.08  2.67  0.23  0.32  0.04
592  000593.SZ  18.64  1.72  0.22  0.60  0.04
866  000867.SZ  16.64  0.91  0.21  0.49  0.03

价值投资组合统计特征

print('价值组合统计特征:')
print(f'平均市盈率: {value_stocks["市盈率"].mean():.2f}')
print(f'平均市净率: {value_stocks["市净率"].mean():.2f}')
print(f'平均ROE: {value_stocks["ROE"].mean():.2%}')
print(f'平均股息率: {value_stocks["股息率"].mean():.2%}')
价值组合统计特征:
平均市盈率: 12.71
平均市净率: 1.45
平均ROE: 25.41%
平均股息率: 4.34%
  • 筛选严格性:通过率约5%,真正的价值股稀缺
  • 筛选标准解读
    • PE<20:不为成长性支付过高价格
    • ROE>15%:公司具有较强竞争优势
    • 负债率<60%:经济下行时不会因债务破产
    • 股息率>2%:即使股价不变也有现金回报

⭐ 平台任务解答代码

Listing 19
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务一
import pandas as pd
price_SHSC = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726305586753.xlsx") #导入数据
price_SHSC["日期"] = pd.to_datetime(price_SHSC["日期"] , format='%Y%m%d')  # 转换为日期时间格式
price_SHSC.set_index("日期",inplace=True)  # 将日期列设为price_SHSC数据框的索引

print(price_SHSC.index) #查看数据框的行索引
print(price_SHSC.columns) #查看数据框的列名
print(price_SHSC.shape)  #看看数据框的形状参数

#任务二
import pandas as pd
price_SHSC = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726305586753.xlsx") #导入数据

price_SHSC["日期"] = pd.to_datetime(price_SHSC["日期"] , format='%Y%m%d')  # 转换为日期时间格式
price_SHSC.set_index("日期",inplace=True)  # 将日期列设为price_SHSC数据框的索引

print(price_SHSC.loc["2024-04-08"])   #查看2024年4月8日的收盘价数据
print(price_SHSC.loc["2024-05-16"])   #查看2024年5月16日的收盘价数据
print(price_SHSC.loc["2024-06-11"])   #查看2024年6月11日的收盘价数据
print(price_SHSC.loc["2024-06-18":"2024-06-21"]) #查看2024年6月18日到2024年6月21日的数据

#任务三
import pandas as pd
price_SHSC = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726305586753.xlsx") #导入数据
price_SHSC["日期"] = pd.to_datetime(price_SHSC["日期"] , format='%Y%m%d')  # 转换为日期时间格式
price_SHSC.set_index("日期",inplace=True)  # 将日期列设为price_SHSC数据框的索引
print(price_SHSC.iloc[15:28,1:4])   #截取第16行至18行、第二列至第四列

#任务四
import pandas as pd
price_SHSC = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/20220819/xlsx/1560448223221932032.xlsx") #导入数据
price_SHSC["日期"] = pd.to_datetime(price_SHSC["日期"] , format='%Y%m%d')  # 转换为日期时间格式
price_SHSC.set_index("日期",inplace=True)  # 将日期列设为price_SHSC数据框的索引
print(price_SHSC[price_SHSC["白云机场"]>=10])  #截取白云机场收盘价大于等于17.6元对应的子数据框
# 输出华能国际
print(price_SHSC[(price_SHSC["华能国际"]<9.5)&(price_SHSC["南方航空"]>5.5)&(price_SHSC["三一重工"]<16)]) 
DatetimeIndex(['2024-04-01', '2024-04-02', '2024-04-03', '2024-04-08',
               '2024-04-09', '2024-04-10', '2024-04-11', '2024-04-12',
               '2024-04-15', '2024-04-16', '2024-04-17', '2024-04-18',
               '2024-04-19', '2024-04-22', '2024-04-23', '2024-04-24',
               '2024-04-25', '2024-04-26', '2024-04-29', '2024-04-30',
               '2024-05-06', '2024-05-07', '2024-05-08', '2024-05-09',
               '2024-05-10', '2024-05-13', '2024-05-14', '2024-05-15',
               '2024-05-16', '2024-05-17', '2024-05-20', '2024-05-21',
               '2024-05-22', '2024-05-23', '2024-05-24', '2024-05-27',
               '2024-05-28', '2024-05-29', '2024-05-30', '2024-05-31',
               '2024-06-03', '2024-06-04', '2024-06-05', '2024-06-06',
               '2024-06-07', '2024-06-11', '2024-06-12', '2024-06-13',
               '2024-06-14', '2024-06-17', '2024-06-18', '2024-06-19',
               '2024-06-20', '2024-06-21', '2024-06-24', '2024-06-25',
               '2024-06-26', '2024-06-27', '2024-06-28'],
              dtype='datetime64[ns]', name='日期', freq=None)
Index(['白云机场', '华能国际', '南方航空', '三一重工', '中体产业'], dtype='object')
(59, 5)
白云机场    10.12
华能国际     9.83
南方航空     5.59
三一重工    15.08
中体产业     8.32
Name: 2024-04-08 00:00:00, dtype: float64
白云机场    10.17
华能国际     8.93
南方航空     5.59
三一重工    17.02
中体产业     9.14
Name: 2024-05-16 00:00:00, dtype: float64
白云机场    10.14
华能国际     9.22
南方航空     5.85
三一重工    15.93
中体产业     8.77
Name: 2024-06-11 00:00:00, dtype: float64
             白云机场  华能国际  南方航空   三一重工  中体产业
日期                                        
2024-06-18  10.00  9.14  5.95  16.02  8.21
2024-06-19   9.87  9.04  5.84  15.82  7.98
2024-06-20   9.61  9.12  5.82  15.71  7.75
2024-06-21   9.54  9.07  5.78  15.94  7.75
            华能国际  南方航空   三一重工
日期                           
2024-04-24  9.72  5.57  15.44
2024-04-25  9.47  5.65  15.36
2024-04-26  9.42  5.72  16.04
2024-04-29  9.22  5.66  16.12
2024-04-30  9.36  5.67  16.31
2024-05-06  9.44  5.70  16.93
2024-05-07  9.23  5.64  16.87
2024-05-08  9.15  5.60  16.66
2024-05-09  9.17  5.68  17.46
2024-05-10  9.26  5.66  17.39
2024-05-13  9.46  5.64  17.37
2024-05-14  9.49  5.66  16.93
2024-05-15  9.12  5.62  16.80
             白云机场  华能国际  南方航空   三一重工   中体产业
日期                                         
2019-04-01  15.01  6.67  8.70  12.95  12.56
2019-04-02  14.70  6.64  8.65  12.63  12.41
2019-04-03  14.95  6.63  8.83  12.92  12.41
2019-04-04  15.00  6.67  9.65  13.36  12.37
2019-04-08  14.46  6.61  9.12  13.80  12.13
2019-04-09  14.47  6.57  9.09  13.56  12.60
2019-04-10  14.30  6.50  9.04  14.00  13.45
2019-04-11  14.25  6.50  8.75  13.18  12.80
2019-04-12  14.07  6.66  8.70  12.98  13.41
2019-04-15  14.05  6.58  8.59  12.87  13.14
2019-04-16  14.30  6.63  8.77  13.22  13.29
2019-04-17  14.19  6.62  8.82  13.11  12.90
2019-04-18  14.18  6.64  8.87  13.16  12.96
2019-04-19  14.44  6.71  8.88  13.13  12.98
2019-04-22  14.13  6.62  8.47  12.19  11.88
2019-04-23  14.16  6.59  8.32  12.29  11.60
2019-04-24  14.33  6.62  8.36  12.33  11.65
2019-04-25  14.45  6.67  8.20  11.88  11.18
2019-04-26  14.51  6.48  8.04  11.92  11.18
2019-04-29  15.04  6.52  8.27  12.30  10.74
2019-04-30  15.24  6.75  8.48  12.25  10.80
2019-05-06  15.09  6.71  7.65  11.40   9.73
2019-05-07  15.97  6.87  7.76  12.12   9.83
2019-05-08  15.90  6.74  7.63  11.85  10.00
2019-05-09  14.78  6.75  7.41  11.86   9.89
2019-05-10  16.26  6.80  7.62  12.45  10.20
2019-05-13  16.52  6.58  7.40  12.21  10.04
2019-05-14  15.88  6.54  7.21  11.96  10.17
2019-05-15  16.08  6.57  7.33  12.14  10.39
2019-05-16  16.58  6.45  7.41  12.15  10.37
2019-05-17  16.19  6.14  7.14  11.70   9.97
2019-05-20  15.87  6.17  7.07  11.59  10.06
2019-05-21  16.35  6.20  7.18  11.89  10.19
2019-05-22  16.69  6.16  7.19  11.95  10.89
2019-05-23  16.70  6.09  7.03  11.90  11.98
2019-05-24  16.30  6.17  7.15  12.03  11.13
2019-05-27  16.18  6.26  7.29  12.31  11.24
2019-05-28  15.92  6.28  7.29  12.65  11.06
2019-05-29  15.80  6.34  7.21  12.58  10.98
2019-05-30  15.55  6.36  7.15  12.35  11.05
2019-05-31  15.67  6.50  7.19  12.07  11.15
2019-06-03  15.75  6.59  7.31  11.96  11.25
2019-06-04  15.59  6.59  7.19  11.97  11.13
2019-06-05  15.33  6.60  7.20  12.09  11.01
2019-06-06  14.96  6.66  7.06  11.95  10.36
2019-06-10  15.64  6.59  6.98  12.21  10.35
2019-06-11  16.14  6.61  7.25  12.92  10.70
2019-06-12  16.09  6.64  7.23  12.90  10.80
2019-06-13  15.94  6.65  7.18  12.95  10.75
2019-06-14  15.80  6.64  7.09  12.79  10.93
2019-06-17  15.68  6.69  7.12  12.75  10.98
2019-06-18  16.18  6.63  7.13  12.88  10.94
2019-06-19  16.29  6.65  7.35  12.90  11.26
2019-06-20  17.16  6.69  7.59  13.18  11.70
2019-06-21  17.02  6.66  7.58  13.13  11.60
2019-06-24  17.65  6.53  7.54  13.18  12.16
2019-06-25  17.82  6.42  7.44  13.05  12.08
2019-06-26  17.72  6.47  7.55  12.95  12.08
2019-06-27  17.83  6.37  7.74  12.95  10.87
2019-06-28  18.20  6.23  7.72  13.08  10.23
             白云机场  华能国际  南方航空   三一重工   中体产业
日期                                         
2019-04-01  15.01  6.67  8.70  12.95  12.56
2019-04-02  14.70  6.64  8.65  12.63  12.41
2019-04-03  14.95  6.63  8.83  12.92  12.41
2019-04-04  15.00  6.67  9.65  13.36  12.37
2019-04-08  14.46  6.61  9.12  13.80  12.13
2019-04-09  14.47  6.57  9.09  13.56  12.60
2019-04-10  14.30  6.50  9.04  14.00  13.45
2019-04-11  14.25  6.50  8.75  13.18  12.80
2019-04-12  14.07  6.66  8.70  12.98  13.41
2019-04-15  14.05  6.58  8.59  12.87  13.14
2019-04-16  14.30  6.63  8.77  13.22  13.29
2019-04-17  14.19  6.62  8.82  13.11  12.90
2019-04-18  14.18  6.64  8.87  13.16  12.96
2019-04-19  14.44  6.71  8.88  13.13  12.98
2019-04-22  14.13  6.62  8.47  12.19  11.88
2019-04-23  14.16  6.59  8.32  12.29  11.60
2019-04-24  14.33  6.62  8.36  12.33  11.65
2019-04-25  14.45  6.67  8.20  11.88  11.18
2019-04-26  14.51  6.48  8.04  11.92  11.18
2019-04-29  15.04  6.52  8.27  12.30  10.74
2019-04-30  15.24  6.75  8.48  12.25  10.80
2019-05-06  15.09  6.71  7.65  11.40   9.73
2019-05-07  15.97  6.87  7.76  12.12   9.83
2019-05-08  15.90  6.74  7.63  11.85  10.00
2019-05-09  14.78  6.75  7.41  11.86   9.89
2019-05-10  16.26  6.80  7.62  12.45  10.20
2019-05-13  16.52  6.58  7.40  12.21  10.04
2019-05-14  15.88  6.54  7.21  11.96  10.17
2019-05-15  16.08  6.57  7.33  12.14  10.39
2019-05-16  16.58  6.45  7.41  12.15  10.37
2019-05-17  16.19  6.14  7.14  11.70   9.97
2019-05-20  15.87  6.17  7.07  11.59  10.06
2019-05-21  16.35  6.20  7.18  11.89  10.19
2019-05-22  16.69  6.16  7.19  11.95  10.89
2019-05-23  16.70  6.09  7.03  11.90  11.98
2019-05-24  16.30  6.17  7.15  12.03  11.13
2019-05-27  16.18  6.26  7.29  12.31  11.24
2019-05-28  15.92  6.28  7.29  12.65  11.06
2019-05-29  15.80  6.34  7.21  12.58  10.98
2019-05-30  15.55  6.36  7.15  12.35  11.05
2019-05-31  15.67  6.50  7.19  12.07  11.15
2019-06-03  15.75  6.59  7.31  11.96  11.25
2019-06-04  15.59  6.59  7.19  11.97  11.13
2019-06-05  15.33  6.60  7.20  12.09  11.01
2019-06-06  14.96  6.66  7.06  11.95  10.36
2019-06-10  15.64  6.59  6.98  12.21  10.35
2019-06-11  16.14  6.61  7.25  12.92  10.70
2019-06-12  16.09  6.64  7.23  12.90  10.80
2019-06-13  15.94  6.65  7.18  12.95  10.75
2019-06-14  15.80  6.64  7.09  12.79  10.93
2019-06-17  15.68  6.69  7.12  12.75  10.98
2019-06-18  16.18  6.63  7.13  12.88  10.94
2019-06-19  16.29  6.65  7.35  12.90  11.26
2019-06-20  17.16  6.69  7.59  13.18  11.70
2019-06-21  17.02  6.66  7.58  13.13  11.60
2019-06-24  17.65  6.53  7.54  13.18  12.16
2019-06-25  17.82  6.42  7.44  13.05  12.08
2019-06-26  17.72  6.47  7.55  12.95  12.08
2019-06-27  17.83  6.37  7.74  12.95  10.87
2019-06-28  18.20  6.23  7.72  13.08  10.23

本章小结

操作类型 方法 关键特性
列选择 df['列名'] / df[['列1','列2']] 单列返回Series,多列返回DataFrame
标签索引 df.loc[行标签, 列标签] 闭区间切片,语义清晰
位置索引 df.iloc[行位置, 列位置] 半开区间切片,算法友好
布尔筛选 df[条件] &/\|/~组合,括号必须
成员检查 df['列'].isin(列表) 哈希表O(1),高效筛选
简洁查询 df.query('条件表达式') 类SQL语法,复杂条件可读性好